package fr.capsuleaube.android.fragment;

import android.app.SearchManager;
import android.content.Context;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;

import fr.capsuleaube.android.R;
import fr.capsuleaube.android.bean.Capsule;
import fr.capsuleaube.android.bean.Producteur;
import fr.capsuleaube.android.utils.Consts;
import fr.capsuleaube.android.utils.ImageLoader;
import fr.capsuleaube.android.utils.PageDownloader;

public class CapsuleDetailFragment extends Fragment {

    // Producteur associée à la capsule sélectionnée
    private Producteur mProducteur;

    // ID de la capsule sélectionnée
    private Integer mCapsuleId;

    // Capsule sélectionnée, obtenue via l'ID et le producteur
    private Capsule mCapsule;

    // Ensemble des vue utilisée dans les différents scénarios d'utilisation
    private View mMainView;
    private View mLoadingView;
    private View mNetworkErrorView;

    // Vue utilisée pour afficher les détails de la capsule sélectionnée
    private View mColorView;

    // Utilisé pour afficher un message d'erreur à l'utilisateur
    // Positionné à vrai lorsque la requête HTTP a échouée
    private boolean mConnectionError = false;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        // Récupération du producteur et de l'ID de la capsule sélectionnée
        // Permet d'obtenir la capsule choisie
        Bundle args = getArguments();
        if (args != null) {
            mProducteur = args.getParcelable(Consts.PRODUCTEUR_BEAN);
            mCapsuleId = args.getInt(Consts.CAPSULE_ID);
        }

        View lView = inflater.inflate(R.layout.capsuledetail_fragment, container, false);

        // Instanciation de la View principale
        mMainView = lView.findViewById(R.id.capsule_detail_mainview);
        mColorView = lView.findViewById(R.id.capsule_detail_color_linearlayout);

        // Instanciation de la LoadingView et de l'ErrorView
        mLoadingView = lView.findViewById(R.id.capsule_detail_loading);
        mNetworkErrorView = lView.findViewById(R.id.capsule_detail_network_error);

        if (mCapsule == null) {
            if (savedInstanceState != null && !savedInstanceState.getBoolean("mConnectionError") && savedInstanceState.getParcelable("mCapsule") != null) {
                // Lors d'un changement de configuration (rotation de l'écran par exemple)
                mCapsule = savedInstanceState.getParcelable("mCapsule");
                mProducteur = savedInstanceState.getParcelable("mProducteur");
                displayColor();
                displayMainView();
            } else if (savedInstanceState != null && savedInstanceState.getBoolean("mConnectionError")) {
                // On recharge le fragment suite à une erreur réseau
                mCapsule = savedInstanceState.getParcelable("mCapsule");
                mProducteur = savedInstanceState.getParcelable("mProducteur");
                new ColorListDownloader().execute(mCapsule.getId());
            } else {
                // Téléchargement des informations depuis Internet
                mCapsule = mProducteur.getCapsuleById(mCapsuleId);
                new ColorListDownloader().execute(mCapsuleId);
            }
        } else {
            // Fragment créé ou restauré
            displayColor();
            displayMainView();
        }

        ImageView imageView = (ImageView) lView.findViewById(R.id.photo_capsule_display_color);
        ImageLoader imageLoader = new ImageLoader(getActivity());
        imageLoader.DisplayImage(mCapsule.getPhotoList().get(0).toString(), imageView, null);

        return lView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Permet l'instanciation de l'ActionBar
        setHasOptionsMenu(true);
        ActionBar lActionBar = ((ActionBarActivity) getActivity()).getSupportActionBar();
        lActionBar.setDisplayHomeAsUpEnabled(true);
        lActionBar.setTitle(mProducteur.getNom());
        lActionBar.setSubtitle(mProducteur.getVillage());
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu items for use in the action bar
        menu.clear();
        inflater.inflate(R.menu.default_actionbar, menu);

        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        if (searchItem != null) {
            SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
            searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        }
    }

    private void displayColor() {

        // L'appel a getActivity dans le code qui suis pose problème suite à une rotation
        // Ce test évite le crash.
        if (getActivity() != null) {

            LinearLayout lLinearLayout = (LinearLayout) mColorView;
            LinkedHashSet<TextView> dynamicTextViews = new LinkedHashSet<TextView>();

            ArrayList<String> colorArrayList = mCapsule.getColorList();
            for (String c : colorArrayList) {
                TextView tv = new TextView(getActivity());
                if (c.startsWith("[indentation]")) {
                    tv.setText(c.replace("[indentation]", ""));
                    tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
                    tv.setTypeface(null, Typeface.BOLD);
                } else {
                    tv.setText(" - " + c);
                    tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
                }
                dynamicTextViews.add(tv);
            }

            for (TextView dynamicTextView : dynamicTextViews) {
                lLinearLayout.addView(dynamicTextView);
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle pOutState) {
        super.onSaveInstanceState(pOutState);

        if (mCapsule != null && !mCapsule.getColorList().isEmpty()) {
            pOutState.putParcelable("mCapsule", mCapsule);
        }
        pOutState.putParcelable("mProducteur", mProducteur);
        pOutState.putBoolean("mConnectionError", mConnectionError);
    }

    private void displayMainView() {
        mNetworkErrorView.setVisibility(View.GONE);
        mLoadingView.setVisibility(View.GONE);
        mMainView.setVisibility(View.VISIBLE);
    }

    private void displayNetworkErrorView() {
        mLoadingView.setVisibility(View.GONE);
        mMainView.setVisibility(View.GONE);
        mNetworkErrorView.setVisibility(View.VISIBLE);
    }

    private class ColorListDownloader extends AsyncTask<Integer, Void, ArrayList<String>> {

        @Override
        protected ArrayList<String> doInBackground(Integer... pCapsuleId) {

            int lSelectedCapsuleId = pCapsuleId[0];

            PageDownloader lPageDL = new PageDownloader();
            String[] lReqParams = new String[]{"http://www.capsuleaube.fr/rechercheAndroidID.php", "GET", "id=" + lSelectedCapsuleId};
            String lPageContent;

            try {
                lPageContent = lPageDL.download(lReqParams);
            } catch (Exception e) {
                mConnectionError = true;
                return null;
            }

            String[] lColorStringArray = lPageContent.split("\n");

            return new ArrayList<String>(Arrays.asList(lColorStringArray));
        }

        @Override
        protected void onPostExecute(ArrayList<String> pColorStringArrayList) {
            if (!mConnectionError) {
                mCapsule.setColorList(pColorStringArrayList);
                displayColor();
                displayMainView();
            } else {
                displayNetworkErrorView();
            }
        }
    }
}
